/*
 * p10256.cpp
 *
 *  Created on: 2013-6-3
 *      Author: zy
 */

/*
 * p11168.cpp
 *
 *  Created on: 2013-6-3
 *      Author: zy
 */

#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
const int maxn = 510;
const double PI = acos(-1.0);
int sig(double d)
{
	return fabs(d) < 1E-10 ? 0 : d < 0 ? -1 : 1;
}
struct Point
{
	double x, y;
	Point()
	{
	}
	Point(double x, double y) :
		x(x), y(y)
	{
	}
	void set(double x, double y)
	{
		this->x = x;
		this->y = y;
	}
	void read()
	{
		scanf("%lf%lf", &x, &y);
	}
	double mod()
	{//模
		return sqrt(x * x + y * y);
	}
	double mod_pow()
	{//模的平方
		return x * x + y * y;
	}
	Point friend operator -(Point a, Point b)
	{
		return Point(a.x - b.x, a.y - b.y);
	}
	Point friend operator +(Point a, Point b)
	{
		return Point(a.x + b.x, a.y + b.y);
	}
	bool friend operator ==(Point a, Point b)
	{
		return sig(a.x - b.x) == 0 && sig(a.y - b.y) == 0;
	}
	bool operator <(const Point &p) const
	{
		return sig(x - p.x) != 0 ? x < p.x : sig(y - p.y) < 0;
	}
};

double cross(Point o, Point a, Point b)
{
	return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);
}
double dot(Point &o, Point &a, Point &b)
{
	return (a.x - o.x) * (b.x - o.x) + (a.y - o.y) * (b.y - o.y);
}
int btw(Point &x, Point &a, Point &b)
{
	return sig(dot(x, a, b));
}
int segCross(Point a, Point b, Point c, Point d)
{
	int d1, d2, d3, d4;
	d1 = sig(cross(a, b, c));
	d2 = sig(cross(a, b, d));
	d3 = sig(cross(c, d, a));
	d4 = sig(cross(c, d, b));
	if ((d1 ^ d2) == -2 && (d3 ^ d4) == -2)
	{
		return 1;
	}
	if (d1 == 0 && btw(c, a, b) <= 0 || d2 == 0 && btw(d, a, b) <= 0 || d3 == 0
			&& btw(a, c, d) <= 0 || d4 == 0 && btw(b, c, d) <= 0)
		return 2;
	return 0;
}
//按x从小到大排序，向右走为合法
int graham(Point*p, int n, int*ch)
{
#define push(x)     ch[len ++]=x
#define pop()		len --
	sort(p, p + n);
	int len = 0, len0 = 1, i;
	for (i = 0; i < n; i++)
	{
		while (len > len0 && sig(cross(p[ch[len - 1]], p[ch[len - 2]], p[i]))
				<= 0)
			pop();
		push(i);
	}
	len0 = len;
	for (i = n - 2; i >= 0; i--)
	{
		while (len > len0 && sig(cross(p[ch[len - 1]], p[ch[len - 2]], p[i]))
				<= 0)
			pop();
		push(i);
	}
	return len - 1;
}
bool onSeg(Point p, Point a, Point b)
{
	return sig(cross(p, a, b)) == 0 && sig(dot(p, a, b)) <= 0;
}
//0 外 2 内 壹 边上
double area(Point * p, int n)
{
	double res = 0;
	p[n] = p[0];
	for (int i = 0; i < n; i++)
	{
		res += p[i].x * p[i + 1].y - p[i + 1].x * p[i].y;
	}
	return res / 2;
}

bool dcmp(double a, double b)
{
	return sig(a - b) < 0;
}
//0 外 2 内 壹 边上
int judge(Point p, int n, Point *ps)
{
	double ang[maxn];
	if (area(ps, n) < 0)
		reverse(ps, ps + n);
	rotate(ps, min_element(ps, ps + n), ps + n);
	for (int i = 1; i < n; i++)
	{
		ang[i] = atan2(ps[i].y - ps[0].y, ps[i].x - ps[0].x);
	}
	ang[0] = -M_PI / 2;
	if (onSeg(p, ps[0], ps[1]) || onSeg(p, ps[0], ps[n - 1]))
		return 1;
	int idx = lower_bound(ang, ang + n, atan2(p.y - ps[0].y, p.x - ps[0].x),
			dcmp) - ang;
	if (idx <= 1 || idx == n)
		return 0; //外面！
	return 1 + sig(cross(ps[idx - 1], ps[idx], p));
}
Point p[maxn], q[maxn], ps[maxn], qs[maxn];
int c1[maxn], c2[maxn];
bool check(Point *p, Point *q, int n, int m)
{
	p[n] = p[0];
	q[m] = q[0];
	if (n == 1)
	{
		if (m == 1)
		{
			if (q[0] == p[0])
				return false;
			return true;
		}
		if (m == 2)
		{
			if (onSeg(p[0], q[0], q[1]))
				return false;
			return true;
		}
		if (judge(p[0], m, q))
			return false;
		return true;
	}
	if (n == 2)
	{
		if (m == 1)
		{
			if (onSeg(q[0], p[0], p[1]))
				return false;
			return true;
		}
		if (m == 2)
		{
			if (segCross(p[0], p[1], q[0], q[1]) == 0)
				return true;
			return false;
		}
		if (judge(p[0], m, q) || judge(p[1], m, q))
			return false;
		for (int i = 0; i < m; i++)
			if (segCross(p[0], p[1], q[i], q[i + 1]) != 0)
				return false;
		return true;
	}
	if (m == 1)
	{
		if (judge(q[0], n, p))
			return false;
		return true;
	}
	if (m == 2)
	{
		if (judge(q[0], n, p) || judge(q[1], n, p))
			return false;
		for (int i = 0; i < n; i++)
			if (segCross(q[0], q[1], p[i], p[i + 1]) != 0)
				return false;
		return true;
	}
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			if (segCross(p[i], p[i + 1], q[j], q[j + 1]) != 0)
				return false;
	for (int i = 0; i < n; i++)
		if (judge(p[i], m, q))
			return false;
	for (int i = 0; i < m; i++)
		if (judge(q[i], n, p))
			return false;
	return true;
}
int main()
{
	int n, m;

	while (scanf("%d%d", &n, &m) && n && m)
	{
		for (int i = 0; i < n; i++)
			p[i].read();
		for (int i = 0; i < m; i++)
			q[i].read();
		int cnt1 = graham(p, n, c1);
		int cnt2 = graham(q, m, c2);
		if (cnt1 == 0)
			cnt1++;
		if (cnt2 == 0)
			cnt2++;
		for (int i = 0; i < cnt1; i++)
			ps[i] = p[c1[i]];
		for (int i = 0; i < cnt2; i++)
			qs[i] = q[c2[i]];
		if (check(ps, qs, cnt1, cnt2))
			puts("Yes");
		else
			puts("No");
	}
	return 0;
}
